/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package proyecto1;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Observable;

/**
 *
 * @author grupo
 */
public class RegistroDeEmpresa extends Observable {

    private String nombreEmpresa;
    private ArrayList<Sucursal> listaSucursales;
    private Hashtable<String, Plan> listaPlanes;

    /**
     *
     * @param nombre
     */
    public RegistroDeEmpresa(String nombre) {
        setNombreEmpresa(nombre);
        listaPlanes = new Hashtable<String, Plan>();
        listaSucursales = new ArrayList<Sucursal>();

        listaSucursales.add(new Sucursal("Sucursal 1", .43));
        listaSucursales.add(new Sucursal("Sucursal 2", .17));
        listaSucursales.add(new Sucursal("Sucursal 3", .31));
        listaSucursales.add(new Sucursal("Sucursal 4", .09));
    }

    /**
     * @return the nombreEmpresa
     */
    public String getNombreEmpresa() {
        return nombreEmpresa;
    }

    /**
     * @return the listaSucursales
     */
    public ArrayList<Sucursal> getListaSucursales() {
        return listaSucursales;
    }

    /**
     *
     * @param index
     * @return
     */
    public Sucursal getSucursal(int index) {
        return listaSucursales.get(index);
    }

    /**
     *
     * @param id
     * @return
     */
    public Sucursal getSucursal(String id) {
        Sucursal sucu = null;

        for (Sucursal suc : listaSucursales) {
            if (suc.getId() == id) {
                sucu = suc;
            }
        }
        return sucu;
    }

    /**
     * @param nombreEmpresa the nombreEmpresa to set
     */
    private void setNombreEmpresa(String nombreEmpresa) {
        this.nombreEmpresa = nombreEmpresa;
    }

    /**
     * @param listaSucursales the listaSucursales to set
     */
    private void setListaSucursales(ArrayList<Sucursal> listaSucursales) {
        this.listaSucursales = listaSucursales;
    }

    /**
     *
     * @param pCodigo
     * @param pPlan
     * @return
     */
    public boolean registrarPlan(String pCodigo, Plan pPlan) {
        if (pPlan != null) {
            listaPlanes.put(pCodigo, pPlan);
            return true;
        } else {
            return false;
        }
    }

    /**
     *
     * @param pCodigo
     * @return
     */
    public Plan obtenerPlan(String pCodigo) {
        if (listaPlanes.containsKey(pCodigo)) {
            return listaPlanes.get(pCodigo);
        } else {
            return null;
        }
    }

    /**
     *
     * @param pPlan
     * @param pSucursal
     * @return
     */
    public boolean registrarPlanConSucursal(Plan pPlan, Sucursal pSucursal) {
        if (pSucursal.tienePlanRegistrado(pPlan.getCodigo())) {
            return false;
        } else {
            pSucursal.registarPlan(pPlan.getCodigo(), pPlan);
            return true;
        }
    }

    /**
     *
     * @return
     */
    public double getIndiceEficaciaGlobal() {
        int planesEfectivos = getCantPlanesEfectivos();

        return (double) planesEfectivos / listaPlanes.size() * 100;
    }

    /**
     *
     * @return
     */
    public String getIndicePrevisionGlobal() {
        if (listaPlanes.size() > 0) {
            int planesPreventivos = getCantPlanesPreventivos();
            int planesCorrectivos = getCantPlanesCorrectivos();

            if (planesPreventivos == 0) {

                double indice = planesPreventivos / planesCorrectivos;
                if (indice > 0) {
                    return "Alto";
                } else {
                    if (indice == 0) {
                        return "Medio";
                    } else {
                        return "Bajo";
                    }
                }
            } else {
                return "N/A";
            }
        } else {
            return "N/A";
        }

    }

    /**
     *
     * @return
     */
    public double getIndicadorEficiencia() {
        double indicador = 0;

        for (Sucursal suc : listaSucursales) {
            indicador += suc.getPeso() * suc.getIndiceEficiencia();
        }
        return indicador;
    }

    /**
     *
     * @return
     */
    public int getCantPlanesEfectivos() {
        int planesPreventivos = 0;
        for (String key : listaPlanes.keySet()) {
            if (listaPlanes.get(key).isPlanEfectivo()) {
                planesPreventivos++;
            }
        }

        return planesPreventivos;
    }

    /**
     *
     * @return
     */
    public int getCantPlanesInfectivos() {
        return listaPlanes.size() - getCantPlanesEfectivos();
    }

    private int getCantPlanesCorrectivos() {
        int planesCorrectivos = 0;
        for (String key : listaPlanes.keySet()) {
            if (listaPlanes.get(key).getTipoDePlan() == TipoDePlan.CORRECTIVO) {
                planesCorrectivos++;
            }
        }

        return planesCorrectivos;
    }

    private int getCantPlanesPreventivos() {
        return listaPlanes.size() - this.getCantPlanesCorrectivos();
    }

    /**
     *
     * @return
     */
    public String getSucursalMayorIndicePrevision() {
        Sucursal mayor = null;
        double indice = 0;

        for (Sucursal suc : listaSucursales) {
            if (suc.getIndicePrevision() > indice) {
                indice = suc.getIndicePrevision();
                mayor = suc;
            }
        }
        if (mayor != null) {
            return mayor.getId();
        } else {
            return "N/A";
        }
    }

    /**
     *
     * @return
     */
    public String getSucursalMayorPreventivos() {
        Sucursal mayor = null;
        int cant = 0;

        for (Sucursal suc : listaSucursales) {
            if (suc.getPlanesPreventivos() > cant) {
                cant = suc.getPlanesPreventivos();
                mayor = suc;
            }
        }
        if (mayor != null) {
            return mayor.getId();
        } else {
            return "N/A";
        }
    }

    /**
     *
     * @return
     */
    public String getSucursalMayorCorrectivos() {
        Sucursal mayor = null;
        int cant = 0;

        for (Sucursal suc : listaSucursales) {
            if (suc.getPlanesCorrectivos() > cant) {
                cant = suc.getPlanesCorrectivos();
                mayor = suc;
            }
        }
        if (mayor != null) {
            return mayor.getId();
        } else {
            return "N/A";
        }
    }
}
